home *** CD-ROM | disk | FTP | other *** search
/ Precision Software Appli…tions Silver Collection 1 / Precision Software Applications Silver Collection Volume One (PSM) (1993).iso / windows / games / wmfread.arj / DLGPROC.C < prev    next >
C/C++ Source or Header  |  1992-11-17  |  26KB  |  866 lines

  1. /***********************************************************************
  2.  
  3.   MODULE     : DLGPROC.C
  4.  
  5.   FUNCTIONS  : WMFRecDlgProc
  6.                EnumRangeDlgProc
  7.                PlayFromListDlgProc
  8.                HeaderDlgProc
  9.                AldusHeaderDlgProc
  10.                ClpHeaderDlgProc
  11.                ListDlgProc
  12.                About
  13.  
  14.   COMMENTS   :
  15.  
  16.   HISTORY    : 1/16/91 - created - drc
  17.  
  18. ************************************************************************/
  19. // COPYRIGHT:
  20. //
  21. //   (C) Copyright Microsoft Corp. 1992.  All rights reserved.
  22. //
  23. //   You have a royalty-free right to use, modify, reproduce and
  24. //   distribute the Sample Files (and/or any modified version) in
  25. //   any way you find useful, provided that you agree that
  26. //   Microsoft has no warranty obligations or liability for any
  27. //   Sample Application Files which are modified.
  28. #include "windows.h"
  29. #include "wmfdcode.h"
  30.  
  31. /***********************************************************************
  32.  
  33.   FUNCTION   : WMFRecDlgProc
  34.  
  35.   PARAMETERS : HWND hDlg
  36.                unsigned message
  37.                WORD wParam
  38.                LONG lParam
  39.  
  40.   PURPOSE    : dialog procedure to handle the user input from the
  41.                dialog box that displays the contents of the metafile
  42.                record.
  43.  
  44.   CALLS      : WINDOWS
  45.                  lstrcpy
  46.                  GlobalLock
  47.                  GlobalUnlock
  48.                  wsprintf
  49.                  SendDlgItemMessage
  50.                  EndDialog
  51.                APP
  52.                  WaitCursor
  53.  
  54.   MESSAGES   : WM_INITDIALOG
  55.                WM_COMMAND
  56.  
  57.   RETURNS    : BOOL
  58.  
  59.   COMMENTS   :
  60.  
  61.   HISTORY    : 1/16/91 - created - drc
  62.  
  63. ************************************************************************/
  64.  
  65.  
  66. BOOL FAR PASCAL WMFRecDlgProc (hDlg, message, wParam, lParam)
  67. HWND hDlg;
  68. unsigned message;
  69. WORD wParam;
  70. LONG lParam;
  71. {
  72.    int i;
  73.    char szMetaFunction[50];
  74.    HFONT hFont;
  75.  
  76.    switch (message)
  77.       {
  78.    case WM_INITDIALOG:
  79.  
  80.       /* font for the parameters listbox */
  81.       hFont = GetStockObject(ANSI_FIXED_FONT);
  82.  
  83.       /* select that font into the parameter listbox */
  84.       SendDlgItemMessage(hDlg, IDL_PARAMETERS, WM_SETFONT, hFont, (LONG)FALSE);
  85.  
  86.    /* initialize the controls of the dialog box to reflect the
  87.       contents of the current metafile record */
  88.  
  89.    /* lookup the metafile function */
  90.       for (i = 0; i < NUMMETAFUNCTIONS; i++)
  91.       {
  92.          if (MetaRec.rdFunction == MetaFunctions[i].value)
  93.             break;
  94.       }
  95.  
  96.       /* if not found then it is an unknown record */
  97.       if (MetaRec.rdFunction != MetaFunctions[i].value)
  98.          lstrcpy((LPSTR)szMetaFunction, (LPSTR)"Unknown");
  99.       else
  100.          lstrcpy((LPSTR)szMetaFunction, (LPSTR)MetaFunctions[i].szFuncName);
  101.  
  102.       /* init the record number */
  103.       SetDlgItemInt(hDlg, IDE_RECNUM, iRecNum, FALSE);
  104.  
  105.       /* init the size control */
  106.       SetDlgItemInt(hDlg, IDE_RECSIZE, (WORD)MetaRec.rdSize, FALSE);
  107.  
  108.       /* init the function name control */
  109.       SetDlgItemText(hDlg, IDE_FUNCTION, (LPSTR)szMetaFunction);
  110.  
  111.       /* check the Hex radio button */
  112.       SendDlgItemMessage(hDlg, IDB_HEX, BM_SETCHECK, TRUE, 0L);
  113.  
  114.       /* load the parameter listbox with the parameters displayed in hex bytes */
  115.       LoadParameterLB(hDlg, MetaRec.rdSize - 3, IDB_HEX);
  116.       return (TRUE);
  117.       break;
  118.  
  119.    case WM_COMMAND:
  120.       switch (wParam)
  121.          {
  122.  
  123.       /* this will handle the checking and  unchecking of the three buttons */
  124.       case IDB_HEX:
  125.  
  126.       case IDB_DEC:
  127.  
  128.       case IDB_CHAR:
  129.          CheckRadioButton(hDlg, IDB_HEX, IDB_CHAR, wParam);
  130.          LoadParameterLB(hDlg, MetaRec.rdSize - 3, wParam);
  131.          break;
  132.  
  133.       case IDGO:
  134.          /* display the hourglass cursor while metafile is playing */
  135.          WaitCursor(TRUE);
  136.          bPlayItAll = TRUE;
  137.          bEnumRange = FALSE;
  138.       /* fall through with appropriate flags set */
  139.  
  140.       case IDOK:
  141.          bPlayRec = TRUE;
  142.       /* fall through with appropriate flags set */
  143.  
  144.       case IDCANCEL:
  145.          EndDialog(hDlg, TRUE);
  146.          return (TRUE);
  147.          break;
  148.  
  149.       case IDQUITENUM:
  150.          /* quit the enumeration.  Setup Dialogbox to return
  151.             FALSE as this return value is checked in a test
  152.             to end the enumeration */
  153.          EndDialog(hDlg, FALSE);
  154.          return (TRUE);
  155.          break;
  156.  
  157.       default:
  158.          return (FALSE);
  159.          }
  160.       break;
  161.  
  162.    default:
  163.       return (FALSE);
  164.       break;
  165.       }
  166.    return (TRUE);
  167. }
  168.  
  169. /***********************************************************************
  170.  
  171.   FUNCTION   : EnumRangeDlgProc
  172.  
  173.   PARAMETERS : HWND hDlg
  174.                unsigned message
  175.                WORD wParam
  176.                LONG lParam
  177.  
  178.   PURPOSE    : This dialog box lets the user specify whether all records
  179.                or a range are to be played.
  180.  
  181.   CALLS      : WINDOWS
  182.                  SendDlgItemMessage
  183.                  GetDlgItemInt
  184.                  HIWORD
  185.                  MessageBox
  186.                  SetFocus
  187.                  InvalidateClientRect
  188.                  EndDialog
  189.  
  190.   MESSAGES   : WM_INITDIALOG
  191.                WM_COMMAND
  192.  
  193.   RETURNS    : BOOL
  194.  
  195.   COMMENTS   :
  196.  
  197.   HISTORY    : 1/16/91 - created - Dennis Crain
  198.  
  199. ************************************************************************/
  200.  
  201.  
  202. BOOL FAR PASCAL EnumRangeDlgProc (hDlg, message, wParam, lParam)
  203. HWND hDlg;                                /* window handle of the dialog box */
  204. unsigned message;                         /* type of message                 */
  205. WORD wParam;                              /* message-specific information    */
  206. LONG lParam;
  207. {
  208.    BOOL lpTranslated;
  209.    RECT rect;
  210.  
  211.    switch (message)
  212.       {
  213.    case WM_INITDIALOG:
  214.       /* play all of the mf records is the default */
  215.       SendDlgItemMessage(hDlg, IDCB_ALL, BM_SETCHECK, 1, 0L);
  216.       return (TRUE);
  217.  
  218.    case WM_COMMAND:
  219.       switch (wParam)
  220.          {
  221.       case IDE_FROM:
  222.  
  223.          /* if the user elects to play a range of record then
  224.             turn the play all check off */
  225.          if (HIWORD(lParam) == EN_CHANGE)
  226.             SendDlgItemMessage(hDlg, IDCB_ALL, BM_SETCHECK, 0, 0L);
  227.          break;
  228.  
  229.       case IDE_TO:
  230.          if (HIWORD(lParam) == EN_CHANGE)
  231.             SendDlgItemMessage(hDlg, IDCB_ALL, BM_SETCHECK, 0, 0L);
  232.          break;
  233.  
  234.       case IDOK:
  235.  
  236.          /* if a range of records is to be played */
  237.          if (!IsDlgButtonChecked(hDlg, IDCB_ALL))
  238.          {
  239.  
  240.             /* set the enumerate range flag */
  241.             bEnumRange = TRUE;
  242.  
  243.             /* initialize the play record flag */
  244.             bPlayRec = FALSE;
  245.  
  246.             /* get the range */
  247.             iStartRange = GetDlgItemInt(hDlg, IDE_FROM, (BOOL FAR *)&
  248.                                         lpTranslated, FALSE);
  249.  
  250.             /* trap the error where the start value has not been entered */
  251.             if (!iStartRange)
  252.             {
  253.                MessageBox(hWndMain, "Invalid FROM value", NULL, MB_OK |
  254.                           MB_ICONEXCLAMATION);
  255.                SetFocus(GetDlgItem(hDlg, IDE_FROM));
  256.                break;
  257.             }
  258.             iEndRange = GetDlgItemInt(hDlg, IDE_TO, (BOOL FAR *)&lpTranslated,
  259.                                       FALSE);
  260.             if (!iEndRange)
  261.             {
  262.                MessageBox(hWndMain, "Invalid TO value", NULL, MB_OK |
  263.                           MB_ICONEXCLAMATION);
  264.                SetFocus(GetDlgItem(hDlg, IDE_TO));
  265.                break;
  266.             }
  267.          }
  268.          /* all records are to be played */
  269.          else
  270.          {
  271.             /* set the enumerate range to false */
  272.             bEnumRange = FALSE;
  273.  
  274.             /* initialize the play it all flag - yes this should
  275.                be false! */
  276.             bPlayItAll = FALSE;
  277.  
  278.             /* init the play record flag */
  279.             bPlayRec = TRUE;
  280.          }
  281.          /* force paint of the client area */
  282.          GetClientRect(hWndMain, (LPRECT)&rect);
  283.          InvalidateRect(hWndMain, (LPRECT)&rect, TRUE);
  284.          EndDialog(hDlg, TRUE);
  285.          return (TRUE);
  286.          break;
  287.  
  288.       case IDCANCEL:
  289.          /* user didn't really want to play the metafile */
  290.          bEnumRange = FALSE;
  291.          bPlayItAll = TRUE;
  292.          bPlayRec = FALSE;
  293.          EndDialog(hDlg, IDCANCEL);
  294.          return (TRUE);
  295.          break;
  296.  
  297.       default:
  298.          return (FALSE);
  299.          }
  300.       break;
  301.       }
  302.    return (FALSE);                           /* Didn't process a message    */
  303. }
  304.  
  305. /***********************************************************************
  306.  
  307.   FUNCTION   : PlayFromListDlgProc
  308.  
  309.   PARAMETERS : HWND hDlg
  310.                unsigned message
  311.                WORD wParam
  312.                LONG lParam
  313.  
  314.   PURPOSE    : a means to indicate whether the selected or unselected
  315.                records among the list of metafile records are to be
  316.                played.
  317.  
  318.   CALLS      : WINDOWS
  319.                  SendDlgItemMessage
  320.                  IsDlgButtonChecked
  321.                  HIWORD
  322.  
  323.   MESSAGES   : WM_INITDIALOG
  324.                WM_COMMAND
  325.  
  326.   RETURNS    : BOOL
  327.  
  328.   COMMENTS   :
  329.  
  330.   HISTORY    : 1/16/91 - created - Dennis Crain
  331.  
  332. ************************************************************************/
  333.  
  334.  
  335. BOOL FAR PASCAL PlayFromListDlgProc (hDlg, message, wParam, lParam)
  336. HWND hDlg;
  337. unsigned message;
  338. WORD wParam;
  339. LONG lParam;
  340. {
  341.    switch (message)
  342.       {
  343.    case WM_INITDIALOG:
  344.       /* the default is to play the selected records */
  345.       SendDlgItemMessage(hDlg, IDCB_SEL, BM_SETCHECK, 1, 0L);
  346.       return (TRUE);
  347.  
  348.    case WM_COMMAND:
  349.       switch (wParam)
  350.          {
  351.       case IDOK:
  352.          /* was the play selected or play unselected button checked? */
  353.          if (IsDlgButtonChecked(hDlg, IDCB_SEL))
  354.             bPlaySelList = TRUE;
  355.          else
  356.             bPlaySelList = FALSE;
  357.          EndDialog(hDlg, TRUE);
  358.          return (TRUE);
  359.  
  360.       case IDCB_SEL:
  361.          /* show the button click */
  362.          if (HIWORD(lParam) == BN_CLICKED)
  363.             SendDlgItemMessage(hDlg, IDCB_UNSEL, BM_SETCHECK, 0, 0L);
  364.          break;
  365.  
  366.       case IDCB_UNSEL:
  367.          /* show the button click */
  368.          if (HIWORD(lParam) == BN_CLICKED)
  369.             SendDlgItemMessage(hDlg, IDCB_SEL, BM_SETCHECK, 0, 0L);
  370.          break;
  371.  
  372.       default:
  373.          return (FALSE);
  374.          }
  375.       break;
  376.       }
  377.    return (FALSE);
  378. }
  379.  
  380. /***********************************************************************
  381.  
  382.   FUNCTION   : HeaderDlgProc
  383.  
  384.   PARAMETERS : HWND hDlg
  385.                unsigned message
  386.                WORD wParam
  387.                LONG lParam
  388.  
  389.   PURPOSE    : show the "standard" metafile header as described in the
  390.                Windows SDK section 9.5.1 of the SDK Reference volume 2
  391.  
  392.   CALLS      : WINDOWS
  393.                  wsprintf
  394.                  SetDlgItemText
  395.                  EndDialog
  396.  
  397.   MESSAGES   : WM_INITDIALOG
  398.                WM_COMMAND
  399.  
  400.   RETURNS    : BOOL
  401.  
  402.   COMMENTS   : Metafile header format
  403.  
  404.                WORD    mtType;
  405.                WORD    mtHeaderSize;
  406.                WORD    mtVersion;
  407.                DWORD   mtSize;
  408.                WORD    mtNoObjects;
  409.                DWORD   mtMaxRecord;
  410.  
  411.                These fields have the following  meanings:
  412.  
  413.                Field          Definition
  414.  
  415.                mtType         specifies whether the metafile is in
  416.                               memory or recorded in a disk file.
  417.                               1 == memory 2 == disk
  418.  
  419.                mtHeaderSize   Specifies the size in words of the metafile
  420.                               header
  421.  
  422.                mtVersion      Specifies the Windows version number.
  423.  
  424.                mtSize         Specifies the size in words of the file
  425.  
  426.                mtNoObjects    Specifies the maximum number of objects that
  427.                               exist in the metafile at the same time
  428.  
  429.                mtMaxRecord    Specifies the size in words of the largest
  430.                               record in the metafile.
  431.  
  432.                mtNoParameters Is not used
  433.  
  434.   HISTORY    : 1/16/91 - created - Dennis Crain
  435.  
  436. ************************************************************************/
  437.  
  438.  
  439. BOOL FAR PASCAL HeaderDlgProc (hDlg, message, wParam, lParam)
  440. HWND hDlg;                                /* window handle of the dialog box */
  441. unsigned message;                         /* type of message                 */
  442. WORD wParam;                              /* message-specific information    */
  443. LONG lParam;
  444. {
  445.    char szBuf[30];
  446.  
  447.    switch (message)
  448.       {
  449.    case WM_INITDIALOG:
  450.       /* format the Windows version number */
  451.       wsprintf((LPSTR)szBuf, "%x", mfHeader.mtVersion);
  452.       SetDlgItemText(hDlg, IDS_VER, (LPSTR)szBuf);
  453.  
  454.       /* format the size of the metafile */
  455.       wsprintf((LPSTR)szBuf, "%lu", mfHeader.mtSize * 2L);
  456.       SetDlgItemText(hDlg, IDS_SIZE, (LPSTR)szBuf);
  457.  
  458.       /* format the maximum numbers of objects that exist
  459.          in the metafile at the same time */
  460.       wsprintf((LPSTR)szBuf, "%d", mfHeader.mtNoObjects);
  461.       SetDlgItemText(hDlg, IDS_OBJECTS, (LPSTR)szBuf);
  462.  
  463.       /* format the size of the largest record in the metafile */
  464.       wsprintf((LPSTR)szBuf, "%lu", mfHeader.mtMaxRecord);
  465.       SetDlgItemText(hDlg, IDS_MAXREC, (LPSTR)szBuf);
  466.       return (TRUE);
  467.  
  468.    case WM_COMMAND:
  469.       if (wParam == IDOK)
  470.       {
  471.          EndDialog(hDlg, TRUE);
  472.          return (TRUE);
  473.       }
  474.       break;
  475.       }
  476.    return (FALSE);
  477. }
  478.  
  479. /***********************************************************************
  480.  
  481.   FUNCTION   : AldusHeaderDlgProc
  482.  
  483.   PARAMETERS : HWND hDlg
  484.                unsigned message
  485.                WORD wParam
  486.                LONG lParam
  487.  
  488.   PURPOSE    : show the "extended" header of Aldus Placeable Metafiles.
  489.  
  490.   CALLS      : WINDOWS
  491.                  wsprintf
  492.                  SetDlgItemText
  493.                  EndDialog
  494.  
  495.   MESSAGES   : WM_INITDIALOG
  496.                WM_COMMAND
  497.  
  498.   RETURNS    : BOOL
  499.  
  500.   COMMENTS   : Aldus placeable metafile format
  501.  
  502.                DWORD    key;
  503.                HANDLE   hmf;
  504.                RECT     bbox;
  505.                WORD     inch;
  506.                DWORD    reserved;
  507.                WORD     checksum;
  508.                char     metafileData[];
  509.  
  510.                These fields have the following  meanings:
  511.  
  512.                Field         Definition
  513.  
  514.                key           Binary key that uniquely identifies this
  515.                              file type.  This must be 0x9AC6CDD7L.
  516.  
  517.                hmf           Unused;  must be zero.
  518.  
  519.                bbox          The coordinates of a rectangle that tightly
  520.                              bounds the picture. These coordinates are in
  521.                              metafile units as defined below.
  522.  
  523.                inch          The number of metafile units to the inch.  To
  524.                              avoid numeric overflow in PageMaker, this value
  525.                              should be less than 1440.
  526.  
  527.                reserved      A reserved double word.  Must be zero.
  528.  
  529.                checksum      A checksum of the 10 words that precede it,
  530.                              calculated by XORing zero with these 10 words
  531.                              and putting the result in the checksum field.
  532.  
  533.                metafileData  The actual content of the Windows metafile
  534.                              retrieved by copying the data returned by
  535.                              GetMetafileBits to the file.  The number of
  536.                              bytes should be equal to the MS-DOS file length
  537.                              minus 22.  The content of a PageMaker placeable
  538.                              metafile  cannot currently exceed 64K (this may
  539.                              have changed in 4.0).
  540.  
  541.   HISTORY    : 1/16/91 - created - Dennis Crain
  542.  
  543. ************************************************************************/
  544.  
  545.  
  546. BOOL FAR PASCAL AldusHeaderDlgProc (hDlg, message, wParam, lParam)
  547. HWND hDlg;                                /* window handle of the dialog box */
  548. unsigned message;                         /* type of message                 */
  549. WORD wParam;                              /* message-specific information    */
  550. LONG lParam;
  551. {
  552.    char szBuf[30];
  553.  
  554.    switch (message)
  555.       {
  556.    case WM_INITDIALOG:
  557.       /* format the key */
  558.       wsprintf((LPSTR)szBuf, "%lx", aldusMFHeader.key);
  559.       SetDlgItemText(hDlg, IDS_KEY, (LPSTR)szBuf);
  560.  
  561.       /* format the x origin of the bounding rectangle */
  562.       wsprintf((LPSTR)szBuf, "%d", aldusMFHeader.bbox.left);
  563.       SetDlgItemText(hDlg, IDS_LEFT, (LPSTR)szBuf);
  564.  
  565.       /* format the x extent of the bounding rectangle */
  566.       wsprintf((LPSTR)szBuf, "%d", aldusMFHeader.bbox.right);
  567.       SetDlgItemText(hDlg, IDS_RIGHT, (LPSTR)szBuf);
  568.  
  569.       /* format the y origin of the bounding rectangle */
  570.       wsprintf((LPSTR)szBuf, "%d", aldusMFHeader.bbox.top);
  571.       SetDlgItemText(hDlg, IDS_TOP, (LPSTR)szBuf);
  572.  
  573.       /* format the y extent of the bounding rectangle */
  574.       wsprintf((LPSTR)szBuf, "%d", aldusMFHeader.bbox.bottom);
  575.       SetDlgItemText(hDlg, IDS_BOT, (LPSTR)szBuf);
  576.  
  577.       /* format the number of metafile units per inch */
  578.       wsprintf((LPSTR)szBuf, "%d", aldusMFHeader.inch);
  579.       SetDlgItemText(hDlg, IDS_INCH, (LPSTR)szBuf);
  580.  
  581.       /* format the checksum */
  582.       wsprintf((LPSTR)szBuf, "%x", aldusMFHeader.checksum);
  583.       SetDlgItemText(hDlg, IDS_CHKSUM, (LPSTR)szBuf);
  584.       return (TRUE);
  585.  
  586.    case WM_COMMAND:                      /* message: received a command */
  587.       if (wParam == IDOK)
  588.       {
  589.          EndDialog(hDlg, TRUE);        /* Exits the dialog box        */
  590.          return (TRUE);
  591.       }
  592.       break;
  593.       }
  594.    return (FALSE);                           /* Didn't process a message    */
  595. }
  596.  
  597. /***********************************************************************
  598.  
  599.   FUNCTION   : ClpHeaderDlgProc
  600.  
  601.   PARAMETERS : HWND hDlg
  602.                unsigned message
  603.                WORD wParam
  604.                LONG lParam
  605.  
  606.   PURPOSE    : show the METAFILEPICT associated with the clipboard
  607.                metafile.  This format is described on page 7-52 of
  608.                the Windows SDK Reference Volume 2.
  609.  
  610.   CALLS      : WINDOWS
  611.                  lstrcpy
  612.                  wsprintf
  613.                  SetDlgItemText
  614.                  EndDialog
  615.  
  616.   MESSAGES   : WM_INITDIALOG
  617.                WM_COMMAND
  618.  
  619.   RETURNS    : BOOL
  620.  
  621.   COMMENTS   : METAFILEPICT format
  622.  
  623.                int    mm;
  624.                int    xExt;
  625.                int    yExt;
  626.                HANDLE hMF;
  627.  
  628.                These fields have the following  meanings:
  629.  
  630.                Field         Definition
  631.  
  632.                mm            specifies the mapping mode in which the picture
  633.                              is drawn.
  634.  
  635.                xExt          specifies the size of the metafile picture for
  636.                              all modes except MM_ISOTROPIC and ANISOTROPIC
  637.                              modes. See SDK reference for more info.
  638.  
  639.                yExt          as above...
  640.  
  641.                hMF           Identifies a memory metafile.
  642.  
  643.   HISTORY    : 1/16/91 - created - Dennis Crain
  644.  
  645. ************************************************************************/
  646.  
  647.  
  648. BOOL FAR PASCAL ClpHeaderDlgProc (hDlg, message, wParam, lParam)
  649. HWND hDlg;
  650. unsigned message;
  651. WORD wParam;
  652. LONG lParam;
  653. {
  654.    char szBuf[30];
  655.  
  656.    switch (message)
  657.       {
  658.    case WM_INITDIALOG:
  659.       /*oormat the mapping mode */
  660.       lstrcpy((LPSTR)szBuf, (MFP.mm == MM_TEXT) ? (LPSTR)"MM_TEXT" : (MFP.mm ==
  661.               MM_LOMETRIC) ? (LPSTR)"MM_LOMETRIC" : (MFP.mm == MM_HIMETRIC) ? (
  662.               LPSTR)"MM_HIMETRIC" : (MFP.mm == MM_LOENGLISH) ? (LPSTR)
  663.               "MM_LOENGLISH" : (MFP.mm == MM_HIENGLISH) ? (LPSTR)"MM_HIENGLISH"
  664.               : (MFP.mm == MM_TWIPS) ? (LPSTR)"MM_TWIPS" : (MFP.mm ==
  665.               MM_ISOTROPIC) ? (LPSTR)"MM_ISOTROPIC" : (MFP.mm == MM_ANISOTROPIC
  666.               ) ? (LPSTR)"MM_ANISOTROPIC" : (LPSTR)"UNKOWN");
  667.       SetDlgItemText(hDlg, IDE_MM, (LPSTR)szBuf);
  668.  
  669.       /* format the xExt */
  670.       wsprintf((LPSTR)szBuf, "%d", MFP.xExt);
  671.       SetDlgItemText(hDlg, IDE_XEXT, (LPSTR)szBuf);
  672.  
  673.       /* format the yExt */
  674.       wsprintf((LPSTR)szBuf, "%d", MFP.yExt);
  675.       SetDlgItemText(hDlg, IDE_YEXT, (LPSTR)szBuf);
  676.       return (TRUE);
  677.  
  678.    case WM_COMMAND:
  679.       if (wParam == IDOK)
  680.       {
  681.          EndDialog(hDlg, TRUE);
  682.          return (TRUE);
  683.       }
  684.       break;
  685.       }
  686.    return (FALSE);
  687. }
  688.  
  689. /***********************************************************************
  690.  
  691.   FUNCTION   : ListDlgProc
  692.  
  693.   PARAMETERS : HWND hDlg
  694.                unsigned message
  695.                WORD wParam
  696.                LONG lParam
  697.  
  698.   PURPOSE    :
  699.  
  700.   CALLS      : WINDOWS
  701.                  GetMetaFile
  702.                  GetDC
  703.                  EnumMetaFile
  704.                  MakeProcInstance
  705.                  FreeProcInstance
  706.                  ReleaseDC
  707.                  EndDialog
  708.                  DeleteMetaFile
  709.                  MessageBox
  710.                  SendDlgItemMessage
  711.                  GlobalAlloc
  712.                  GlobalLock
  713.                  DialogBox
  714.                APP
  715.                  PlayIt
  716.  
  717.   MESSAGES   : WM_INITDIALOG
  718.                WM_COMMAND
  719.  
  720.   RETURNS    : BOOL
  721.  
  722.   COMMENTS   :
  723.  
  724.   HISTORY    :
  725.  
  726. ************************************************************************/
  727.  
  728.  
  729. BOOL FAR PASCAL ListDlgProc (hDlg, message, wParam, lParam)
  730. HWND hDlg;
  731. unsigned message;
  732. WORD wParam;
  733. LONG lParam;
  734. {
  735.    HDC hDC;
  736.  
  737.    CurrenthDlg = hDlg;
  738.    switch (message)
  739.       {
  740.    case WM_INITDIALOG:
  741.       /* initalize the current record number */
  742.       iRecNum = 0;
  743.  
  744.       /* if this metafile is not already in memory then get it*/
  745.       if (!bMetaInRam)
  746.          hMF = GetMetaFile((LPSTR)OpenName);
  747.  
  748.       /* if hMF is a valid handle */
  749.       if (hMF)
  750.       {
  751.          hDC = GetDC(hWndMain);
  752.  
  753.          /* let the enumeration callback function know that we are
  754.             enumerating the records to a list */
  755.          iEnumAction = ENUMMFLIST;
  756.          lpprocEnumMF = MakeProcInstance((FARPROC)MetaEnumProc, hInst);
  757.          EnumMetaFile(hDC, hMF, lpprocEnumMF, (LONG)NULL);
  758.          FreeProcInstance((FARPROC)lpprocEnumMF);
  759.          if (!bMetaInRam)
  760.             hMF = DeleteMetaFile(hMF);
  761.          ReleaseDC(hWndMain, hDC);
  762.       }
  763.       else
  764.          MessageBox(hWndMain, "GetMetaFile failed", NULL, MB_OK | MB_ICONHAND);
  765.       return (TRUE);
  766.  
  767.    case WM_COMMAND:
  768.       switch (wParam)
  769.          {
  770.       case IDOK:
  771.  
  772.       case IDCANCEL:
  773.          EndDialog(hDlg, TRUE);
  774.          return (TRUE);
  775.          break;
  776.  
  777.       case IDL_PLAY:
  778.  
  779.          //get the number of selected items
  780.          iNumSel = SendDlgItemMessage(hDlg, IDL_LBREC, LB_GETSELCOUNT, 0, 0L);
  781.  
  782.          //allocate a buffer large enough to save the indexes
  783.          hSelMem = GlobalAlloc(GHND, iNumSel * sizeof(int));
  784.  
  785.          //lock it down and assign a long ptr to it
  786.          if (hSelMem)
  787.          {
  788.             lpSelMem = (int FAR *)GlobalLock(hSelMem);
  789.             if (!lpSelMem)
  790.                return (FALSE);
  791.          }
  792.          else
  793.             return (FALSE);
  794.  
  795.          //get the actual indexes and put in buffer
  796.          iLBItemsInBuf = SendDlgItemMessage(hDlg, IDL_LBREC, LB_GETSELITEMS, (
  797.                                             WORD)iNumSel, (DWORD)lpSelMem);
  798.          bEnumRange = FALSE;
  799.          bPlayItAll = FALSE;
  800.          bPlayList = TRUE;
  801.          iCount = 0; //reset index into lpSelMem
  802.  
  803.          /*dialog to play selected or unselected records*/
  804.          lpPlayFromListDlgProc = MakeProcInstance(PlayFromListDlgProc, hInst);
  805.          DialogBox(hInst, "PLAYWHAT", hDlg, lpPlayFromListDlgProc);
  806.          FreeProcInstance(lpPlayFromListDlgProc);
  807.  
  808.          /* end this dialog prematurely to get on with playing of recs */
  809.          EndDialog(hDlg, TRUE);
  810.  
  811.          /* play the metafile to the appropriate destination */
  812.          PlayMetaFileToDest(hWndMain, iDestDC);
  813.          break;
  814.  
  815.       default:
  816.          return (FALSE);
  817.          }
  818.       break;
  819.       }
  820.    return (FALSE);
  821. }
  822.  
  823. /****************************************************************************
  824.  
  825.     FUNCTION: About(HWND, unsigned, WORD, LONG)
  826.  
  827.     PURPOSE:  Processes messages for "About" dialog box
  828.  
  829.     MESSAGES:
  830.  
  831.         WM_INITDIALOG - initialize dialog box
  832.         WM_COMMAND    - Input received
  833.  
  834.     COMMENTS:
  835.  
  836.         No initialization is needed for this particular dialog box, but TRUE
  837.         must be returned to Windows.
  838.  
  839.         Wait for user to click on "Ok" button, then close the dialog box.
  840.  
  841. ****************************************************************************/
  842.  
  843.  
  844. BOOL FAR PASCAL About (hDlg, message, wParam, lParam)
  845. HWND hDlg;                                /* window handle of the dialog box */
  846. unsigned message;                         /* type of message                 */
  847. WORD wParam;                              /* message-specific information    */
  848. LONG lParam;
  849. {
  850.    switch (message)
  851.       {
  852.    case WM_INITDIALOG:                /* message: initialize dialog box */
  853.       return (TRUE);
  854.  
  855.    case WM_COMMAND:                      /* message: received a command */
  856.       if (wParam == IDOK                /* "OK" box selected?          */ ||
  857.           wParam == IDCANCEL)
  858.       {      /* System menu close command? */
  859.          EndDialog(hDlg, TRUE);        /* Exits the dialog box        */
  860.          return (TRUE);
  861.       }
  862.       break;
  863.       }
  864.    return (FALSE);                           /* Didn't process a message    */
  865. }
  866.